package server

import (
	"crypto/rand"
	"encoding/base32"
	"fmt"
	"net/url"
	"strings"
	"time"

	"github.com/pquerna/otp"
	"github.com/pquerna/otp/totp"
)

// GenerateSecret 生成一个新的 TOTP 密钥
func GenerateSecret() (string, error) {
	// 生成随机字节
	bytes := make([]byte, 20)
	_, err := rand.Read(bytes)
	if err != nil {
		return "", err
	}

	// 转换为 base32 编码
	secret := base32.StdEncoding.EncodeToString(bytes)
	// 移除填充字符 =
	secret = strings.TrimRight(secret, "=")
	return secret, nil
}

// GenerateQRCodeURL 生成用于 Google Authenticator 的二维码 URL
func GenerateQRCodeURL(issuer, account, secret string) string {
	return fmt.Sprintf("otpauth://totp/%s:%s?secret=%s&issuer=%s&algorithm=SHA1&digits=6&period=30",
		url.PathEscape(issuer),
		url.PathEscape(account),
		secret,
		url.QueryEscape(issuer))
}

// ValidateCode 验证 TOTP 动态码
func ValidateCode(secret, code string) (bool, error) {
	// 添加回填充字符
	paddedSecret := secret
	if len(secret)%8 != 0 {
		paddedSecret = secret + strings.Repeat("=", 8-len(secret)%8)
	}

	// 验证动态码
	opts := totp.ValidateOpts{
		Period:    30,
		Skew:      1,
		Digits:    otp.DigitsSix,
		Algorithm: otp.AlgorithmSHA1,
	}
	// Fix: Capture both return values from ValidateCustom
	valid, err := totp.ValidateCustom(code, paddedSecret, time.Now(), opts)
	return valid, err
}

// GenerateCode 生成当前的 TOTP 动态码（用于测试）
func GenerateCode(secret string) (string, error) {
	// 添加回填充字符
	paddedSecret := secret
	if len(secret)%8 != 0 {
		paddedSecret = secret + strings.Repeat("=", 8-len(secret)%8)
	}

	// 生成动态码
	opts := totp.ValidateOpts{
		Period:    30,
		Skew:      1,
		Digits:    otp.DigitsSix,
		Algorithm: otp.AlgorithmSHA1,
	}
	return totp.GenerateCodeCustom(paddedSecret, time.Now(), opts)
}
